Additive (h=0) \[ t_{pt,p0} \simeq \frac{1}{s}ln \left(\frac{p_{t}(1-p_{0})}{p_{0}(1-p_{t})}\right)\]
Recessive (h=-1) \[ t_{pt,p0} \simeq \frac{1}{2s}\left[ln \left(\frac{p_{t}(1-p_{0})}{p_{0}(1-p_{t})}\right) - \frac{1}{p_{t}} + \frac{1}{p_{0}}\right]\]
Dominant (h=1) \[ t_{pt,p0} \simeq \frac{1}{2s}\left[ln \left(\frac{p_{t}(1-p_{0})}{p_{0}(1-p_{t})}\right) + \frac{1}{1-p_{t}} - \frac{1}{1-p_{0}}\right]\]
Simple Crow and Kimura Example for additive model
h = 0 # dominance coefficient = 0 = additive
p_0 = 0.1 # Starting frequency of favored allele
p_t = 0.5 # Final frequency of favored allele
# Equation
t_gen = (1)* log((p_t*(1-p_0))/(p_0*(1-p_t)))
# Number of generations given selection coefficient (s)
Number of generations to reach final allele frequency: 2.2 \(s^{-1}\)
Generation time Function
## Function
# This function requires three arguements:
# p_0 : Initial allele frequency : Values 0-1
# p_t : Final allele frequency : Values 0-1
# fitness_type : Allele interaction : 'Additive','dominant','recessive'
gen_time <- function(p_0=0.1,p_t=0.9,fitness_type = "additive"){
if(fitness_type == "additive"){
t_gen = (1)* log((p_t*(1-p_0))/(p_0*(1-p_t)))
}else{
if(fitness_type == "dominant"){
t_gen = 0.5 *(log((p_t*(1-p_0))/(p_0*(1-p_t)))+(1/(1-p_t))-(1/(1-p_0)))
}else{
if(fitness_type == "recessive"){
t_gen = 0.5 *(log((p_t*(1-p_0))/(p_0*(1-p_t)))-(1/p_t)+(1/p_0))
}else{
return(print("Incorrect fitness_type specified. Please use either 'additive','dominance',or 'recessive'"))
}
}
}
return(t_gen)
}
Recessive Allele
# Calculating generations for recessive allele to go from frequency of 0.1
# to 0.7
rec = gen_time(p_0=0.1,p_t=0.7,fitness_type="recessive")
gen_time(p_0=0.1,p_t=0.5,fitness_type="recessive")
## [1] 5.098612
Number of generations to reach final allele frequency: 5.81 \(s^{-1}\)
Dominant Allele
# Calculating generations for dominant allele to go from frequency of 0.4
# to 0.8
dom = gen_time(p_0=0.4,p_t=0.8,fitness_type="dominant")
Number of generations to reach final allele frequency: 2.56 \(s^{-1}\)
p_0 = seq(0.1,0.9,by=0.01) # Range of starting frequencies
p_t = seq(0.1,0.9,by=0.01) # Range of end frequencies
p_frequencies = expand.grid(p_0,p_t)
colnames(p_frequencies) = c("p_0","p_t") # Relabel data.frame
p_frequencies = p_frequencies[p_frequencies$p_t-p_frequencies$p_0 > 0,] # Remove cases where p_t is lower than p_0
# Additive
p_frequencies$gen_add <- gen_time(p_frequencies$p_0,p_frequencies$p_t)
# Recessive
p_frequencies$gen_rec <- gen_time(p_frequencies$p_0,p_frequencies$p_t,
fitness_type = "recessive")
# Dominant
p_frequencies$gen_dom <- gen_time(p_frequencies$p_0,p_frequencies$p_t,
fitness_type = "dominant")
# Coverting generation estimates into data.frame matrices
p_frequencies_add_wide <- dcast(p_frequencies, p_0 ~ p_t, value.var="gen_add")[,-1]
p_frequencies_rec_wide <- dcast(p_frequencies, p_0 ~ p_t, value.var="gen_rec")[,-1]
p_frequencies_dom_wide <- dcast(p_frequencies, p_0 ~ p_t, value.var="gen_dom")[,-1]
# Converting data.frame objects into matrix objects
p_frequencies_add <- data.matrix(p_frequencies_add_wide)
p_frequencies_rec <- data.matrix(p_frequencies_rec_wide)
p_frequencies_dom <- data.matrix(p_frequencies_dom_wide)